﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Super_Pong.Classes;

//Testar esse objeto

namespace spParticle
{
    class CollisionManager
    {

        #region Atributos
        //Lista de entidades para checar colisão
        List<Entity> entities;
        //Contador de checagem dupla
        int CCD = 0;
        #endregion

        #region Construtores
        /// <summary>
        /// Construtor padrão.
        /// </summary>
        public CollisionManager()
        {
            //Inicializa a lista de entities
            entities = new List<Entity>();
        }
        #endregion

        #region Métodos

        /// <summary>
        /// Adiciona uma lista completa a lista de checagem
        /// </summary>
        /// <param name="list"></param>
        public void addEntities(List<Entity> list)
        {
            //Checa se vale apena adicionar
            if (list != null && list.Count() > 0)
            {
                //Adiciona uma lista completa.
                entities.AddRange(list);
            }
        }

        /// <summary>
        /// Adiciona uma entidade para checar colisão entre todas as outras.
        /// </summary>
        /// <param name="e">Entidade a responder a colisão.</param>
        public void addEntity(Entity e)
        {
            //Se a entidade nao é nula
            if(e != null){
                //Adiciona ela na lista
                entities.Add(e);
            }
        }

        /// <summary>
        /// Remove uma entidade comparando seu objeto.
        /// </summary>
        /// <param name="e">A entidade a ser removida.</param>
        public void removeEntity(Entity e)
        {
            //Checa se a lista contém a entidade em questão
            if(entities.Contains(e)){
                //Remove a entidade
                entities.Remove(e);
            }
        }

        /// <summary>
        /// Remove uma entidade pelo seu Index.
        /// </summary>
        /// <param name="e">O index a ser removida.</param>
        public void removeEntity(int i)
        {
            //Checa se a lista contém a entidade em questão
            if (entities.Count() > i)
            {
                //Remove a entidade
                entities.RemoveAt(i);
            }
        }

        /// <summary>
        /// Checa a colisão e aplica a resposta de cada entidade na lista.
        /// Não atualiza as entidades!
        /// </summary>
        public void Update()
        {
            //Inicia a checagem de colisão de cada entidade
            foreach(Entity e in entities){
                //Checa se a entidade ainda é valida
                if(e != null){
                
                    //Passa por todas as entidades checando se há colisão pelo método padrão
                    for (int i = CCD;i < entities.Count();i++)
                    {
                        //Entidade a checar com e
                        Entity target = entities.ElementAt(i);
                        //Checa se o alvo nao nullou
                        if (target != null && !target.Equals(e))
                        {
                            //Checa a colisão e aplica a resposta
                            if (e.isColliding(target))
                            {
                                e.collide(target);
                            }
                        }
                    }
                    //Avança um da checagem
                    CCD++;

                }
            }

            //Zera o CCD
            CCD = 0;

            //Limpa a lista
            entities.RemoveAll(item => item == null);
        }
        #endregion

    }
}
